/**
  * Author: Mei
  * Date: 2020-12-10 10:09
  * Description: 
  * Alias Type 和similar to typedef
  *
  * typename() 会生成临时对象  比如list<>()
  *
  */
#include <vector>
#include <iostream>
#include <bitset>
#include <functional>
#include <algorithm>
#include <list>

using namespace std;


typedef void (*func)(int, int);

using func = void (*)(int, int);

void example(int, int) {
    cout << "show。。。" << endl;
}

/******************** noexcept **********************/
void foo() noexcept;//保证这个函数不会丢出异常 等同于void foo() noexcept(true);

class MySting {
private:
    char *data;
    size_t len;
public:
    MySting(MySting &&str) noexcept : data(str.data), len(str.len) { //一般只有vector才会右值不需要手动抛出异常  别人才会安心使用

    }

};
/******************** override **********************/
//用在虚函数上面
struct Base {
    virtual void vfund(float) {

    }
};

struct Derived : Base {
    virtual void vfund(float) override { //告诉编译器我是要重载父类  避免与父类函数签名写错

    }
};

/******************** final **********************/
//用在类上面 不允许继承
struct Base1 final {
}; //告诉编译器 该类不允许继承

struct Derived1 : Base1 { //不允许继承
};

//用在方法上面 不允许重写
struct Base2 {
    virtual void f() final;
};

struct Derived2 : Base2 { //不允许继承
    void f(); //不允许重写
};

int main() {
    func fn = example;
    fn(1, 2);


    return 0;
}
